package cz.tpj.util.attractive_place;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import cz.tpj.database.bod_zaujmu.Bod_zaujmu;
import cz.tpj.database.zamestnanec.Zamestnanec;
import cz.tpj.logic.Navigation;
import cz.tpj.util.ErrorDatabase;

/**
 * Trida typu jedinacek. Slouzi k synchronizovanemu ukladani, mazani a meneni 
 * dat v databazove tabulce Bod_zaujmu.
 */
public class AttractivePlace {
	private static AttractivePlace IM = null;
	private Bod_zaujmu actualPlace = null;
	private HttpSession session = null;
	private String message = new String();
	//navigace
	public static final String ID 			= "id";
	public static final String NAME 		= "name";
	public static final String SHORT_DESCR 	= "short_descr";
	public static final String LONG_DESCR 	= "long_descr";
	public static final String CITY_ID		= "city_id";
	public static final String GPS 			= "gps";
	//
	public static final String ACTUAL_PLACE_INSTANCE ="actual_place_instance";
	public static final String MESSAGE = "message";
	//--------soukromy konstruktor----
	private AttractivePlace(){}
	
	//
	public static AttractivePlace getInstance(){
		if(IM == null)
			IM = new AttractivePlace();
		return IM;
	}
	
	public boolean fetchPlace(HttpServletRequest request){
		session = request.getSession(true);
		boolean ok = true;
		message = "";
		//instance tridy
		try {
			actualPlace = new Bod_zaujmu();
		} catch (ErrorDatabase e) {
			message = "<p>" + e.getMessage() + "</p>";
		}
		//do teto instance postupne nacti z formulare co se da
		//----------------------------------------------------
		//nacti id
		setId(request);
		//nacti jmeno
		ok = setName(ok, request);
		//nacti kratky popis
		ok = setShrotDescr(ok, request);
		//nacti dlouhy popis
		ok = setLongDescr(ok, request);
		//zjisti id aktualne prihlaseneho zamstnance
		ok = setEmploeeId(ok);
		//nacti mesto
		ok = setCityId(ok, request);
		//nacti GPS souradnice
		ok = setGps(ok, request);
		//nastavit aktualni cas
		setTime();
		//-----------------------------------------------------
		//nastaveni vysledku do session
		session.setAttribute(ACTUAL_PLACE_INSTANCE, actualPlace);
		session.setAttribute(MESSAGE, message);
		return ok;
	}
	

	/**
	 *  Aktualnimu mistu (jeho objektu) nastavi id zajimaveho mista. To nacte z formulare.
	 */
	private void setId(HttpServletRequest request) {
		String parametr = request.getParameter(ID);
		try {
			actualPlace.setId(parametr);
		} catch (ErrorDatabase e) {}
	}

	/**
	 * Aktualnimu mistu (jeho objektu) nastavi nazev. Ten nacte z formulare.
	 */
	private boolean setName(boolean ok, HttpServletRequest request) {
		String parametr = request.getParameter(NAME);
		try {
			actualPlace.setNazov(parametr);
			//zkontroluj, aby mel nazev alespon jeden znak, jinak posli zpravu
			if(parametr.length() < 1){
				message += "<p>Název musí obsahovat alespoň jeden znak!</p>";
				ok = false;
			}
		} catch (ErrorDatabase e) {
			ok = false;
			message += "<p>" + e.getMessage() + "</p>";
		}
		return ok;
	}

	/**
	 * Aktualnimu mistu (jeho objektu) nastavi kratky popis. Ten nacte z formulare.
	 */
	private boolean setShrotDescr(boolean ok, HttpServletRequest request) {
		String parametr = request.getParameter(SHORT_DESCR);
		try {
			actualPlace.setKratkyPopis(parametr);
		} catch (ErrorDatabase e) {
			ok = false;
			message += "<p>" + e.getMessage() + "</p>";
		}
		return ok;
	}

	/**
	 * Aktualnimu mistu (jeho objektu) nastavi dalouhy popis. Ten nacte z formulare.
	 */
	private boolean setLongDescr(boolean ok, HttpServletRequest request) {
		String parametr = request.getParameter(LONG_DESCR);
		try {
			actualPlace.setDlhyPopis(parametr);
		} catch (ErrorDatabase e) {
			ok = false;
			message += "<p>" + e.getMessage() + "</p>";
		}
		return ok;
	}

	/**
	 * Aktualnimu mistu (jeho objektu) nastavi id zamestnance, ktery ho vytvoril.
	 */
	private boolean setEmploeeId(boolean ok) {
		Zamestnanec z = (Zamestnanec)session.getAttribute(Navigation.EMPLOYEE);
		if(z == null){
			ok = false;
			message += "<p>Zřejmně jste byl automaticky odhlášen, pokuste se přihlásit znovu!</p>";
		}else{
			//nacti id zamestnance ze session
			String employeeId = z.getId();
			try {
				//nastav v aktualnim bode zajmu aktualni id zamestnance
				actualPlace.setZamestnanec(employeeId);
			} catch (ErrorDatabase e) {
				ok = false;
				message += "<p>" + e.getMessage() + "</p>";
			}
		}
		return ok;
	}
	
	/**
	 * Aktualnimu mistu (jeho objektu) nastavi id mesta, ktere nacte z formulare.
	 */
	private boolean setCityId(boolean ok, HttpServletRequest request) {
		String parametr = request.getParameter(CITY_ID);
		//pokud neni vybrane zadne mesto, pak hod hlasku a vrat false
		if(parametr == null || parametr.length() == 0){
			message += "<p>Tomuto místu je zapotřebí přiřadit město!</p>";
			return false;
		}
		//id mesta ted mozes nacist do aktualniho Zajimaveho mista
		try {
			actualPlace.setMesto(parametr);
		} catch (ErrorDatabase e) {
			ok = false;
			message += "<p>" + e.getMessage() + "</p>";
		}
		//
		return ok;
	}
	
	/**
	 * Aktualnimu mistu (jeho objektu) nastavi souradnice GPS. Ten nacte z formulare.
	 */
	private boolean setGps(boolean ok, HttpServletRequest request) {
		String parametr = request.getParameter(GPS);
		try {
			actualPlace.setGps(parametr);
		} catch (ErrorDatabase e) {
			ok = false;
			message += "<p>" + e.getMessage() + "</p>";
		}
		return ok;
	}
	
	
	/**
	 * Aktualnimu mistu (jeho objektu) nastavi aktualni cas.
	 */
	private void setTime(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String date = sdf.format(new Date());
		try {
			actualPlace.setPridane(date);
			actualPlace.setNaposledyEditovane(date);
		} catch (ErrorDatabase e) {
			e.printStackTrace();
		}
	}
}
